home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
BLOCK
/
Block.cpp
next >
Wrap
C/C++ Source or Header
|
2000-02-06
|
6KB
|
301 lines
/********************************************************************************/
/* */
/* "THE BLOCK BUSTER" */
/* */
/********************************************************************************/
// 以下のコメントをはずすと,”Borland C++ Builder3”でコンパイルが可能になる
//#define BCB WinMain
#include "el.h"
// 画面定義
#define MAIN_SCREEN 1 // メイン画面
#define OVER_SCREEN 2 // ゲームオーバ画面
// 画面用関数のプロトタイプ宣言
void MainScreen(void);
void OverScreen(void);
// 関数のプロトタイプ宣言
void InitFunc(void); // 初期化
// グラフィックオブジェクト
DDOBJ PadBMP; // パドル
DDOBJ BallBMP; // ボール
DDOBJ BlockBMP; // ブロック
DDOBJ CanvasBMP; // 背景
// サウンドオブジェクト
DSOBJ HitWAV; // 命中
DSOBJ MissWAV; // ミス
// ボール
struct ball{
bool Vw; // 描画
float X,Y; // 座標
float XAdd,YAdd; // 移動量
float AddSpeed; // 速度
}Ball;
int Score; // スコア
int HiScore=300; // ハイスコア
int BlockCnt; // ブロックカウンター
const int PAD_Y=400; // パドルのY座標
const int MAX_X=9; // ブロック数最大値(横)
const int MAX_Y=6; // " (縦)
const int BLOCK_X=104; // ブロック描画の先頭座標(横)
const int BLOCK_Y=100; // " (縦)
// 汎用
int x,y;
// ブロック
int Block[MAX_X][MAX_Y];
// 反発力テーブル
float PadDir[16][2]={
-257.082106f,-138.905142f, // 左
-257.082106f,-147.085399f,
-264.576387f,-141.419023f,
-231.903130f,-190.317982f,
-190.317982f,-231.903130f,
-141.419023f,-264.576387f,
-87.0853995f,-287.082106f,
-29.405142f,-298.555416f, //
29.405142f,-298.555416f, // 中央
87.0853995f,-287.082106f,
141.4190235f,-264.576387f,
190.3179825f,-231.903130f,
231.9031305f,-190.317982f,
264.5763873f,-141.419023f,
257.0821063f,-147.085399f,
257.0821064f,-138.905142f // 右
};
// メイン関数
int elMain("THE BLOCK BUSTER")
{
// elWindow(640,480,FALSE);
// elSetWindow(RUN_NOTOP|RUN_INACTIVE);
elLoop()
{
elSetScreen(MAIN_SCREEN,MainScreen());
elSetScreen(OVER_SCREEN,OverScreen());
}
elExitMain();
}
// ウィンドウ生成関数
void elCreate(void)
{
elDraw::Screen(640,480);
// ビットマップファイルの読み込み
BallBMP=elDraw::LoadObject("BMP\\BALL.BMP");
PadBMP=elDraw::LoadObject("BMP\\PAD.BMP");
BlockBMP=elDraw::LoadObject("BMP\\BLOCK.BMP");
CanvasBMP=elDraw::LoadObject("BMP\\CANVAS.BMP");
// サウンドファイル(WAVE)の読みこみ
HitWAV=elSound::LoadObject("SOUND\\HIT.WAV");
MissWAV=elSound::LoadObject("SOUND\\MISS.WAV");
elCallScreen(MAIN_SCREEN);
}
// キーボード関数
void elKeyboard(void)
{
case VK_ESCAPE:
elDraw::Exit();
break;
elExitKeyboard();
}
// イベント関数
long elEvent(void)
{
elExitEvent();
}
// メイン画面
void MainScreen(void)
{
// 画面が切り替わった直後の場合
if (elChangeScreen())
{
// 初期化処理関数の呼び出し
Score=0;
InitFunc();
}
elDraw::Clear();
// ゲーム画面の描画
elDraw::DirectLayer(0,0,CanvasBMP,0,0,640,480);
// 右マウスクリックでゲームスタート
if (MouseCL)
Ball.Vw=TRUE;
if (!Ball.Vw && Blink)
SHOW2(240,260,"Please Click Your Mouse...");
// ブロックの描画
for (x=0;x<MAX_X;x++){
for (y=0;y<MAX_Y;y++){
if (!Block[x][y])
continue;
elDraw::Layer((x*48)+BLOCK_X,(y*16)+BLOCK_Y,BlockBMP,0,0,48,16);
}
}
// ボールの移動処理&描画
if (Ball.Vw){
Ball.X+=FrameTime*Ball.XAdd;
Ball.Y+=FrameTime*Ball.YAdd;
elDraw::Layer((int)Ball.X,(int)Ball.Y,BallBMP,0,0,16,16);
}
// パドルの移動範囲をチェック
if (MousePX<100)
MousePX=100;
if (MousePX>640-64-100)
MousePX=640-64-100;
// パドルの描画
elDraw::Layer(MousePX,PAD_Y,PadBMP,0,0,64,24);
// スコア表示
SHOW2(0,0,"Score %5d Hi-Score %5d",Score,HiScore);
elDraw::Refresh();
// パドルとボールの当り判定
if ((int)Ball.Y+16>PAD_Y && (int)Ball.Y+16<PAD_Y+24){
if ((int)Ball.X>MousePX-16 && (int)Ball.X<MousePX+64){
// パドルのどこにボールが当たったのか?
x=((int)(Ball.X+8-MousePX)>>2);
if (x<0) x=0;
if (x>15) x=15;
// 反発力テーブルを参照して,ボールの移動量を決定
Ball.XAdd=PadDir[x][0]*Ball.AddSpeed;
Ball.YAdd=PadDir[x][1]*Ball.AddSpeed;
if (Ball.YAdd>=16) Ball.YAdd=16;
}
}
// ブロックとの当たり判定
for (y=0;y<MAX_Y;y++){
if ((int)Ball.Y<(y*16)+BLOCK_Y-16 ||
(int)Ball.Y>=(y*16)+BLOCK_Y+16)
continue;
for (x=0;x<MAX_X;x++){
if ((int)Ball.X+16<(x*48)+BLOCK_X ||
(int)Ball.X>=(x*48)+48+BLOCK_X)
continue;
// ブロックは生きているか?
if (!Block[x][y])
continue;
// そのブロックを消す
Block[x][y]=FALSE;
// ボールの符号の反転
// Ball.XAdd=-Ball.XAdd;
Ball.YAdd=-Ball.YAdd;
// ボール加速度の決定
if(Ball.AddSpeed<F(1.6))
Ball.AddSpeed+=F(0.01);
BlockCnt++;
Score+=10;
if (Score>HiScore)
HiScore=Score;
elSound::Play(HitWAV);
y=999;
break;
}
}
// ゲームクリア?
if (BlockCnt==MAX_X*MAX_Y)
InitFunc();
// ボールの移動範囲をチェック
if (Ball.X<F(100)){
Ball.X=F(100);
Ball.XAdd=-Ball.XAdd;
}
if (Ball.X>F(524)){
Ball.X=F(524);
Ball.XAdd=-Ball.XAdd;
}
if (Ball.Y<F(24)){
Ball.Y=F(24);
Ball.YAdd=-Ball.YAdd;
}
// ボールが最下段へ落ちたらゲームオーバ
if (Ball.Y>F(440))
elCallScreen(OVER_SCREEN);
}
// ゲームオーバ関数
void OverScreen(void)
{
// 画面が切り替わった直後の場合
if (elChangeScreen())
{
elSound::Play(MissWAV);
}
SHOW2(294,260,"GAME OVER");
elDraw::Refresh();
// 再びメイン画面処理関数へ
if (MouseCL)
elCallScreen(MAIN_SCREEN);
}
// ゲーム初期化関数
void InitFunc(void)
{
// ボール情報の初期化
Ball.Vw=FALSE;
Ball.X=F(200);
Ball.Y=F(250);
Ball.XAdd=F(100);
Ball.YAdd=F(100);
Ball.AddSpeed=F(1);
// ブロック情報の初期化
BlockCnt=0;
for(x=0;x<MAX_X;x++){
for(y=0;y<MAX_Y;y++){
Block[x][y]=TRUE;
}
}
}